package br.unidocs.web.listener;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;

import com.sun.faces.application.ActionListenerImpl;

public class ExceptionHandler extends ActionListenerImpl {
	private static final Logger log = Logger.getLogger(ExceptionHandler.class
			.getName());

	/** Mensagem padrão para erros gerais. */
	private static final String msgErroGeral = "Erro Geral. Entre em contato com o administrador do sistema.";

	/** Alias para redirecionamento de erros gerais. */
	private static final String redirectErroGeral = "erroGeral";

	/**
	 * Método utilizado para capturar e tratar todas as exceções não tratadas
	 * pela aplicação.<br/>
	 * Para excecções ele adiciona uma mensagem padrão de erro de geral e
	 * redireciona para a página com o mapeamneto "erroGeral"
	 * 
	 * @param event
	 *            {@link ActionEvent}
	 * @throws AbortProcessingException
	 */
	@Override
	public void processAction(ActionEvent event)
			throws AbortProcessingException {
		try {
			super.processAction(event);
		} catch (Exception e) {
			log.error("Erro geral.", e);
			FacesContext context = FacesContext.getCurrentInstance();
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, msgErroGeral, null);
			context.addMessage(null, facesMessage);
			context.getApplication().getNavigationHandler()
					.handleNavigation(context, null, redirectErroGeral);
		}

	}
}
